package main

import (
	"fmt"
	"sort"
)

func main() {
	//var map 变量名 = map[keytype]valuetype
	// map声明举例，通常为int、string
	// var a map[string]string
	// var a map[string]int
	// var a map[int]string
	// var a map[string]map[string]string
	// var a map[string]interface{}  k-string, v-任意类型

	//声明不会分配内存，初始化需要make，分配内存后才能赋值使用

	// 使用方式
	//方式1
	var a map[string]string
	a = make(map[string]string, 5)
	a["lan1"] = "go"
	fmt.Println(a)

	//方式2
	b := make(map[string]string)
	b["lan"] = "python"
	fmt.Println(b)

	//方式3
	c := map[string]string{
		"lan": "java",
	}
	c["lan2"] = "C"

	fmt.Println(c)

	// var a map[string]map[string]string
	//person := make(map[string]map[string]string)
	person := make(map[string]map[string]interface{})

	//person["p1"] = make(map[string]string)
	person["p1"] = make(map[string]interface{})
	person["p1"]["name"] = "tom"
	//person["p1"]["age"] = strconv.Itoa(20)
	person["p1"]["age"] = 20
	person["p1"]["gender"] = "男"

	//person["p2"] = make(map[string]string)  // 必须再次make
	person["p2"] = make(map[string]interface{}) // 必须再次make
	person["p2"]["name"] = "jack"

	fmt.Println(person)

	// 增删改查
	// 1.增、改
	// 如果key不存在为增。存在则改

	// 2. 查
	//map["xxx"],如果key存在，获取该key对应值，key不存在，获取默认值
	//获取的有两个返回值

	// 3. 删
	//delete(map, key), 如果key不存在，不操作也不报错
	//如果删除所有，第一个就要遍历，对每一个key进行删除
	//或者直接对这个map重新make，让原来的成为垃圾被回收
	//确保删除key存在，可以先获取是否存在
	_, ok := person["p3"]
	if !ok {
		fmt.Println("键不存在")
	} else {
		delete(person, "p3")
	}

	// 长度
	s := len(person)
	fmt.Println(s, len(person["p1"]))

	// 切片
	//切片的类型为map，则这个切片为map切片
	//声明一个map切片,并make
	//map_slice := make([]map[string]string)

	//遍历map
	//使用for .. range..遍历map，map为无序的

	//排序map
	//方式1，如果key为整型，可以使用for循环，遍历取到map[i]的值

	//方式2：将key存入到切片中，使用sort包中方法排序，在遍历切片获取索引值
	var keySlice = make([]string, 0, len(person["p1"]))
	for k, _ := range person["p1"] {
		keySlice = append(keySlice, k)
	}

	sort.Strings(keySlice)
	fmt.Println(keySlice)

	for _, k := range keySlice {
		fmt.Println(person["p1"][k])
	}

	//如果倒序则使用Reverse
	sort.Sort(sort.Reverse(sort.StringSlice(keySlice)))
	fmt.Println(keySlice)
	for _, k := range keySlice {
		fmt.Println(person["p1"][k])
	}

}
